package me.huha.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.log4j.Logger;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * 类名: JsonUtils.java 
 * 描述: json 工具类 
 * 作者: Yepx 
 * 创建日期: 2017年2月10日 上午11:46:26
 */
public class JsonUtils {
    
	private static Logger logger = Logger.getLogger(JsonUtils.class);
	
	public static void main(String[] args) {
		String str = "{'message':'ok','nu':'114062235007912501','companytype':'rufengda','ischeck':'1','com':'rufengda','status':'1','condition':'F00','codenumber':'114062235007912501','state':'3'}";
		Map<String, Object> map = parseJSON2Map(str);
		System.out.println(map);
	}

	/**
	 * @param list
	 * @param total
	 * @return
	 */
	public String getEasyUiJsonFromList(List<?> list, Integer total) {
		JSONArray jsonArray = new JSONArray();
		for (Iterator<?> iterator = list.iterator(); iterator.hasNext();) {
			Map<?, ?> map = (Map<?, ?>) iterator.next();
			Set<?> keySet = map.keySet();
			JSONObject jsonObject = new JSONObject();
			for (Object key : keySet) {
				// jsonObject.put(StringUtil.toCamel((String) key),
				// map.get(key));
				Object value = map.get(key);
				jsonObject.put((String) key, value == null ? "" : value);
			}
			jsonArray.add(jsonObject);
		}
		JSONObject jsonResult = new JSONObject();
		jsonResult.put("total", total == null ? new Integer(list.size())
				: total);
		jsonResult.put("rows", jsonArray);
		jsonResult.toString();
		return jsonResult.toString();
	}

	/**
	 * @param list
	 * @param total
	 * @return {resultCode:"",totalCount:10,value}
	 */

	public String getJsonFromList(Map<String, List<?>> myMap) {
		JSONObject jsonResult = new JSONObject();
		Set<?> myKeySet = myMap.keySet();
		for (Object myKey : myKeySet) {
			// jsonObject.put(StringUtil.toCamel((String) key),
			// map.get(key));
			List<?> list = myMap.get(myKey);
			JSONArray jsonArray = new JSONArray();
			for (Iterator<?> iterator = list.iterator(); iterator.hasNext();) {
				Map<?, ?> map = (Map<?, ?>) iterator.next();
				Set<?> keySet = map.keySet();
				JSONObject jsonObject = new JSONObject();
				for (Object key : keySet) {
					// jsonObject.put(StringUtil.toCamel((String) key),
					// map.get(key));
					Object value = map.get(key);
					jsonObject.put((String) key, value == null ? "" : value);
				}
				jsonArray.add(jsonObject);
			}
			jsonResult.put(myKey.toString(), jsonArray);
		}
		return jsonResult.toString();
	}

	/**
	 * @param list
	 * @param total
	 * @return {resultCode:"",totalCount:10,value}
	 */

	public String getJsonFromList(List<?> list, Integer total) {
		JSONArray jsonArray = new JSONArray();
		for (Iterator<?> iterator = list.iterator(); iterator.hasNext();) {
			Map<?, ?> map = (Map<?, ?>) iterator.next();
			Set<?> keySet = map.keySet();
			JSONObject jsonObject = new JSONObject();
			for (Object key : keySet) {
				// jsonObject.put(StringUtil.toCamel((String) key),
				// map.get(key));
				Object value = map.get(key);
				jsonObject.put((String) key, value == null ? "" : value);
			}
			jsonArray.add(jsonObject);
		}
		JSONObject jsonResult = new JSONObject();
		jsonResult.put("resultCode", "SUCCESS");
		jsonResult.put("totalCount", total == null ? new Integer(list.size())
				: total);
		jsonResult.put("value", jsonArray);
		jsonResult.toString();
		return jsonResult.toString();
	}

	/**
	 * @param list
	 * @param total
	 * @return {resultCode:"",total:10,rows}
	 */

	public String getJsonFromListForEasiUIDatagrid(
			List<Map<String, Object>> list, Integer total) {
		JSONArray jsonArray = new JSONArray();
		for (Iterator<?> iterator = list.iterator(); iterator.hasNext();) {
			Map<?, ?> map = (Map<?, ?>) iterator.next();
			Set<?> keySet = map.keySet();
			JSONObject jsonObject = new JSONObject();
			for (Object key : keySet) {
				// jsonObject.put(StringUtil.toCamel((String) key),
				// map.get(key));
				Object value = map.get(key);
				jsonObject.put((String) key, value == null ? "" : value);
			}
			jsonArray.add(jsonObject);
		}
		if (total == null) {
			if (list == null || list.isEmpty()) {
				total = 0;
			} else if (list.get(0).get("TotalRecordCount") != null) {
				total = Integer.parseInt(list.get(0).get("TotalRecordCount")
						.toString());
			} else {
				total = list.size();
			}
		}
		JSONObject jsonResult = new JSONObject();
		jsonResult.put("resultCode", "SUCCESS");
		jsonResult.put("total", total);
		jsonResult.put("rows", jsonArray);
		jsonResult.toString();
		return jsonResult.toString();
	}

	public String getJsonFromListForEasiUIDatagrid(
			List<Map<String, Object>> list) {
		return getJsonFromListForEasiUIDatagrid(list, null);
	}

	/** 返回格式{{1},{2}} */
	public String getJsonFromListNoCount(List<?> list) {
		JSONArray jsonArray = new JSONArray();
		for (Iterator<?> iterator = list.iterator(); iterator.hasNext();) {
			Map<?, ?> map = (Map<?, ?>) iterator.next();
			Set<?> keySet = map.keySet();
			JSONObject jsonObject = new JSONObject();
			for (Object key : keySet) {
				// jsonObject.put(StringUtils.toCamel((String)key),
				// map.get(key));
				jsonObject.put(key, map.get(key) + "");
			}
			jsonArray.add(jsonObject);
		}
		return jsonArray.toString();
	}

	/** 返回格式{{1},{2}} */
	public String getJsonFromMapNoCount(Map<?, ?> map) {
		JSONArray jsonArray = new JSONArray();
		Set<?> keySet = map.keySet();
		JSONObject jsonObject = new JSONObject();
		for (Object key : keySet) {
			jsonObject.put(key, map.get(key) + "");
		}
		jsonArray.add(jsonObject);
		return jsonArray.toString();
	}

	/** 返回格式{resultCode:'SUCCESS',totalCount:10,value:{}} */
	public String getJsonFromList(List<?> list) {
		return getJsonFromList(list, list.size());
	}

	public String getJsonGridList(List<?> list, Integer total, int start,
			int limit) {
		JSONArray jsonArray = new JSONArray();
		for (int i = start; i < (limit + start); i++) {
			if (i < list.size()) {
				Map<?, ?> map = (Map<?, ?>) list.get(i);
				Set<?> keySet = map.keySet();
				JSONObject jsonObject = new JSONObject();
				for (Object key : keySet) {
					// jsonObject.put(StringUtil.toCamel((String) key),
					// map.get(key));
					jsonObject.put(key, map.get(key));
				}
				jsonArray.add(jsonObject);
			}
		}
		JSONObject jsonResult = new JSONObject();
		jsonResult.put("resultCode", "SUCCESS");
		jsonResult.put("totalCount", total == null ? new Integer(list.size())
				: total);
		jsonResult.put("value", jsonArray);
		return jsonResult.toString();
	}

	/**
	 * list 分页
	 * 
	 * @param list
	 * @param start
	 * @param limit
	 * @return
	 */
	public String getJsonGridList(List<?> list, int start, int limit) {
		return getJsonGridList(list, list.size(), start, limit);
	}

	/**
	 * 从json对象集合表达式中得到一个java对象列表
	 * 
	 * @param jsonString
	 * @param pojoClass
	 * @return
	 */
	public List<Object> getList4Json(String jsonString, Class<?> pojoClass) {

		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		JSONObject jsonObject;
		Object pojoValue;

		List<Object> list = new ArrayList<Object>();
		for (int i = 0; i < jsonArray.size(); i++) {
			jsonObject = jsonArray.getJSONObject(i);
			pojoValue = JSONObject.toBean(jsonObject, pojoClass);
			list.add(pojoValue);

		}
		return list;
	}

	/**
	 * 从json数组中解析出java字符串数组
	 *
	 * @param jsonString
	 * @return
	 */
	public List<String> getStringArray4Json(String jsonString) {

		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		List<String> stringArray = new ArrayList<String>();
		for (int i = 0; i < jsonArray.size(); i++) {
			stringArray.add(jsonArray.getString(i));
		}
		return stringArray;
	}

	/**
	 * 将List转为Json字符串，与getJsonFromList不同
	 *
	 * @Title: getJsonArray
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @param list
	 * @return 设定文件
	 * @return String 返回类型
	 * @throws
	 */
	public String getJsonArray(List<?> list) {

		JSONArray js = JSONArray.fromObject(list);
		if (js != null) {
			return js.toString();
		}
		return "";
	}

	/**
	 * 将JSon字符串转为JavaBean
	 * 
	 * @Title: getJsonStringToObject
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @param jsonString
	 *            josn字符串
	 * @param beanClass
	 *            要转换的Bean
	 * @return 设定文件
	 * @return Object 返回类型
	 * @throws
	 */
	public Object getJsonStringToObject(String jsonString, Class<?> beanClass) {
		JSONObject jsonObject = JSONObject.fromObject(jsonString);
		return JSONObject.toBean(jsonObject, beanClass);

	}

	/**
	 *
	 * @Title: getObjectToJsonString
	 * @Description: 将对象转化为jsonString
	 * @param bean
	 * @return String 返回类型
	 * @throws
	 */
	public static String getObjectToJsonString(Object bean) {
		return JSONObject.fromObject(bean).toString();
	}

	/**
	 * JSON 转化为 List
	 * 
	 * @param jsonStr
	 * @return
	 */
	public static List<Map<String, Object>> parseJSON2List(String jsonStr) {
		JSONArray jsonArr = JSONArray.fromObject(jsonStr);
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Iterator<JSONObject> it = jsonArr.iterator();
		while (it.hasNext()) {
			JSONObject json2 = it.next();
			list.add(parseJSON2Map(json2.toString()));
		}
		return list;
	}

	/**
	 * JSON 转化为 Map
	 * 
	 * @param jsonStr
	 * @return
	 */
	public static Map<String, Object> parseJSON2Map(String jsonStr) {
		Map<String, Object> map = new HashMap<String, Object>();
		// 最外层解析
		JSONObject json = JSONObject.fromObject(jsonStr);
		for (Object k : json.keySet()) {
			Object v = json.get(k);
			// 如果内层还是数组的话，继续解析
			if (v instanceof JSONArray) {
				List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
				Iterator<JSONObject> it = ((JSONArray) v).iterator();
				while (it.hasNext()) {
					JSONObject json2 = it.next();
					list.add(parseJSON2Map(json2.toString()));
				}
				map.put(k.toString(), list);
			} else {
				map.put(k.toString(), v);
			}
		}
		return map;
	}
}